/***************************************************************************
 创建者：华磊
 开始时间：               : 2020.11.29
 copyright            : (C) 深圳市华友高科有限公司
 修改说明：（每次有修改就添加一条，带有 修改人，修改时间，修改描述）

 修改人:华磊
 修改时间:
 修改内容:整合

 ***************************************************************************
 *   主菜单窗口程序
 *                                                                         *
 ***************************************************************************/
#ifndef HOMEMENUDELEGATE_H
#define HOMEMENUDELEGATE_H

#include "homemenudelegate_global.h"
#include "../HomeMenuView/homemenuview.h"
#include "../CommunicateDelegate/hmicommunicate.h"
#include <QObject>
#include "systemcmddelegate.h"
#include "../CommunicateDelegate/moveoperation.h"
#include "../HomeMenuView/passwordcheckdialog.h"

#define  MIN_INT -9999999

#ifdef BUILD_X86_WINDOWS "c:"
#define RESTORE_HMI_FILE "c:"
#define RESTORE_CTRL_FILE "c:"
#define TMP_COPY_PATH "c:"
#else
/*示教器的还原文件地址*/
#define RESTORE_HMI_FILE "/root/hmiPackage_bak.zip"
/*控制器的还原文件地址*/
#define RESTORE_CTRL_FILE "/agvwork/AgvFundation/fundation/TcrController_bak.zip"
/*缓存中转站 地址*/
#define TMP_COPY_PATH "/agvwork/AgvFundation/fundation/tmp/"
#endif

//#define MIN_INT -9999999
class CommunicateNormalDelegate;

class HOMEMENUDELEGATESHARED_EXPORT HomeMenuDelegate : public QObject
{

    Q_OBJECT

public:

    HomeMenuDelegate(HomeMenuView *homeMenuViewIn,  GlobalData *globalDataIn,MoveOperation *moveOperationIn,
                        CommunicateNormalDelegate *communicateNormalDelegateIn,QObject* parent=0);
    ~HomeMenuDelegate();

public:

    void showBackupView();  //备份界面更新

    /**
     * @brief initDeviceLogView     子页面:日志 初始化日志界面
     */
    void initDeviceLogView();

    /**
     * @brief getLog                子页面:日志 读取日志内容
     */
    void getLog();
    void getXmlFileLog(QString xmlLogFileName, QVector<Message> &messageOut);
    /**
     * @brief writeIniCtrlIP        保存控制器IP
     */
    void writeIniCtrlIP(QString type, QString ip, QString gateway, QString dns);

    /**
     * @brief operateAllowFlag      用于判断当前是否允许操作
     * @return
     */
    bool operateAllowFlag();

    void gsoapGetLogFileInfo(QVector <struct Message > &logInfoList);

    //子页面  实际事件处理的的槽信号
signals:
    void showOtherSettingDlgSignal();
    void setMotorDcModeSignal(int value);
    void clearMotorBatteryErrorSignal();
    void writeEthercatDeviceAliasSignal(int nodeId,int alias);
    void getEthercatSlavesInformationSignal();
    void getPogramEngineDebugInfoSignal();
    void getMotionEngineDebugInfoSignal();
    void getTaskInfoSignal();

    void allowCalibrateJogSignal(bool enable);

    void calibrateOneAxisSignal(int axisId);

    void getCalibrateInformationSingal();

    /**
     * @brief msgBoxSignal              通知 打开消息框
     */
    void msgBoxSignal(int type,QString title,QString text);

    /**
     * @brief manualChangeSignal        子页面:软件使能 开启关闭 通知:控制器
     * @param onOff
     */
    void manualChangeSignal(int onOff);

    /**
     * @brief setAllCaliberSignal       子页面:零点标定 标定 通知:控制器
     */
    void setAllCaliberSignal();

    /**
     * @brief systemCmdRestoreSignal    子页面:还原
     * @param cmd
     */
    void systemCmdRestoreSignal(QString cmd);
    /**
     * @brief systemCmdBackupAllSignal  子页面:备份(全部\系统参数\程序文件\坐标系\机器人配置)
     * @param cmd
     */
    void systemCmdBackupAllSignal(QString cmd);
    void systemCmdBackupGlobalSignal(QString cmd);
    void systemCmdBackupProgramSignal(QString cmd,int n);
    void systemCmdBackupDatSignal(QString cmd,int n);
    void systemCmdBackupConfigSignal(QString cmd,int n);

    /**
     * @brief getCalculateData          子页面:坐标系 获取数据信号
     * @param robotID
     */
    void getCalculateData(int robotID);
    /**
     * @brief sendToolCalculateData     子页面:坐标系 示教 计算 工具坐标系
     * @param tmpData
     */
    void sendToolCalculateData(int robotID,HmiToolCoordinateInformation tmpData);
    /**
     * @brief sendUserCalculateData     子页面:坐标系 示教 计算 用户坐标系
     * @param tmpData
     */
    void sendUserCalculateData(int robotID,HmiUserCoordinateInformation tmpData);
//    /**
//     * @brief moveToPointSignal         子页面:坐标系 示教 移动到点
//     * @param movePoint
//     */
//    void moveToPointSignal(MoveParameter movePoint);
//    /**
//     * @brief stopMoveToPointSignal     子页面:坐标系 示教 停止移动到点
//     */
//    void stopMoveToPointSignal();

    /**
     * @brief sendRegistNumToCtrl       子页面:注册 发送控制器 注册码注册
     * @param registNum
     */
    void sendRegistNumToCtrl(QString registNum);

    /**
     * @brief passwordChangeSignal      子页面:密码修改 控制器密码
     */
    void passwordChangeSignal(int acc ,QString userPsw,QString newPsw);

    /**
     * @brief sendCtrlSetIP             子页面:IP修改 控制器IP
     */
    void sendCtrlSetIP(ControllerIpGroupInfo info);
    void controllerShutDownEnableSignal(bool enable);

    /**
     * @brief sendStartTypeSignal       子页面:启动 修改启动模式
     * @param type
     */
    void sendStartTypeSignal(int type);

    /**
     * @brief sendShutDownSignal        子页面:启动 关机
     * @param type
     */
    void sendShutDownSignal();

    /**
     * @brief setEditLanguageSignal 设置编辑界面的语言
     * @param lang
     */
    void setEditLanguageSignal(int lang);

    /**
     * @brief connectVrep				连接vrep
     * @return
     */
    int signal_connectVrep(QString ip,int port);

    /**
     * @brief disconnectVrep			断开连接vrep
     * @return
     */
    int signal_disconnectVrep();

    /**
     * @brief setVrepServoType			设置vrep伺服模式
     * @return
     */
    int signal_setVrepServoType(int type);

    /**
     * @brief setVrepIoType				设置vrep IO模式
     * @return
     */
    int signal_setVrepIoType(int type);

    /**
     * @brief showFileManage_Signal     显示文件管理界面
     */
    void showFileManage_Signal();

    //子页面  实际事件处理的的槽函数.

    /**
     * @brief requastGetLogInfo_Signal    请求ｇｓｏａｐ获取日志文件信息
     */
    void requastGetLogInfo_Signal();

    void showBeltTrackView_signal();
    void showWeldConditionView_signal();
    void showWeldPropertyView_signal();
    void showWaveMotionConditionView_signal();
    void showFleetDebugView_signal();
    void showLaserCameraConfigView_signal();
    void showAxisSettingView_signal();
    void showCoupleControlView_signal();
    void showPalletSettingView_signal();

    /**
     * @brief showWeldSystemConfigView_signal 显示弧焊系统设置页面
     */
    void showWeldSystemConfigView_signal();

public slots:
    void showWeldPropetyViewErrorMsg(QString msg);
    void recordPoint_slot();
    void clearPoint_slot();
    void calculateZero_slot();
    void setZeroOffset_slot();

    /**
     * @brief getRobotLogFile_Slot      获取日志信息成功响应槽函数
     * @param logInfo
     */
    void getRobotLogFile_Slot(QVector <struct Message> logInfo);

    void allowCalibrateJogSlot(bool enable);

    void calibrateOneAxisSlot(int axisId);

    void getCalibrateInformationSlot();

    void showCalibrateInfo(S_AXISGROUP_ZERO_INFORMATION zeroInformationOut);

    void passWordCheckSlot(bool isPasswordOk);

    /**
     * @brief manualChangeBtnSlot       子页面:软件使能 开启关闭按钮 处理
     * @param onOff
     */
    void manualChangeBtnSlot(int onOff);
    /**
     * @brief setCaliberBtnSlot         子页面:零点标定 载入按钮
     */
    void setCaliberBtnSlot();

    /**
     * @brief startWaveFormSlot         子页面:监视器 启动按钮
     */
    void startWaveFormSlot();
    /**
     * @brief ceaseWaveFormSlot         子页面:监视器 停止按钮
     */
    void ceaseWaveFormSlot();
    /**
     * @brief realTimeSlot              子页面:监视器 数据更新定时器
     */
    void realTimeSlot();

    /**
     * @brief initCoordinateData        子页面:坐标系 初始化 坐标系数据
     */
    void initToolCoordinateData(QVector<HmiToolCoordinateInformation> recvTool);
    void initUserCoordinateData(QVector<HmiUserCoordinateInformation> recvUser);
    void reloadCoordinateData();

    /**
     * @brief selectToolCoordinateSlot  子页面:坐标系 选择显示工具坐标响应槽函数
     */
    void selectToolCoordinateSlot();

    /**
     * @brief selectUserCoordinateSlot  子页面:坐标系 选择显示用户坐标响应槽函数
     */
    void selectUserCoordinateSlot();

    /**
     * @brief recordPointSlot           子页面:坐标系 载入点响应槽函数
     * @param coordinateIndex           选择编辑的坐标系行号
     * @param pointIndex                选择的点的行号
     */
    void recordPointSlot(int coordinateType, int method, int pointIndex);

    /**
     * @brief calculateCoordinateSlot   子页面:坐标系 计算响应槽函数
     * @param coordinateType            载入方式(三点六点四点直接)
     * @param coordinateIndex           选择编辑的坐标系行号
     */
    void calculateCoordinateSlot(int coordinateType, int coordinateIndex);

    /**
     * @brief recvCalculateDataSlot     子页面:坐标系 接收来自comm的工具坐标计算结果
     */
    void recvCalculateToolDataSlot(HmiToolCoordinateInformation recvTool);
    /**
     * @brief recvCalculateDataSlot     子页面:坐标系 接收来自comm的工具坐标计算结果
     */
    void recvCalculateUserDataSlot(HmiUserCoordinateInformation recvUser);

    /**
     * @brief moveToCoordinatePointSlot 子页面:坐标系 移动到点响应槽函数
     * @param coordinateType            选择的坐标系类型
     * @param coordinateIndex           选择编辑的坐标系行号
     * @param pointIndex                选择的点的行号
     */
    void moveToCoordinatePointPressSlot(MoveParameter tmpPoint);

    /**
     * @brief moveToCoordinatePointSlot 子页面:坐标系 移动到点停止 响应槽函数
     */
    void moveToCoordinatePointReleaseSlot();

    void setToolMass_slot(int toolIndex, double mass,QVector<double> center);

    /**
     * @brief restoreFileSlot           子页面:还原 还原文件
     * @param restoreFileLocation       文件地址
     */
    void restoreFileSlot(QString restoreFileLocation);
    /**
     * @brief backupFileSlot            子页面:备份 备份文件
     * @param allFlag
     * @param userProgramFlag
     * @param coordinateFlag
     * @param robotConfigFlag
     * @param systemConfigFlag
     * @param robot
     * @param backupLocation
     */
    void backupFileSlot(int allFlag,int userProgramFlag,int coordinateFlag,int robotConfigFlag,
                        int systemConfigFlag,QVector<RobotBackUpInformation> robot,QString backupLocation);

    /**
     * @brief registrateSlot            子页面:注册 注册码输入 注册
     * @param regisNum
     */
    void registrateSlot(QString regisNum);
    /**
     * @brief registrateSlot            子页面:注册 通过文件载入方式 注册
     * @param regisNum
     */
    void registrateFromFileSlot(QString fileAddress);
    /**
     * @brief registrateSlot            子页面:注册 接收 来自com delegate的注册结果
     * @param regisNum
     */
    void recvRegistrateResult(ReturnRegisterStatus returnStatus);

	/**
     * @brief showCurrentRobotMessageSlot   子页面:日志 显示当前机器人消息响应槽函数
     */
    void showCurrentRobotMessageSlot();

    /**
     * @brief showAllRobotMessageSlot       子页面:日志 显示全部机器人消息响应槽函数
     */
    void showAllRobotMessageSlot();

    /**
     * @brief errorMessageShowOrHideSlot    子页面:日志 错误消息显示与否响应槽函数
     * @param errorFlag　错误消息显示与否标志
     */
    void errorMessageShowOrHideSlot(int errorFlag);

    /**
     * @brief warnMessageShowOrHideSlot     子页面:日志 警告消息显示与否响应槽函数
     * @param warnFlag　警告消息显示与否标志
     */
    void warnMessageShowOrHideSlot(int warnFlag);

    /**
     * @brief noteMessageShowOrHideSlot     子页面:日志 提示消息显示与否响应槽函数
     * @param noteFlag　提示消息显示与否标志
     */
    void noteMessageShowOrHideSlot(int noteFlag);

    /**
     * @brief waitMessageShowOrHideSlot     子页面:日志 等待消息显示与否响应槽函数
     * @param waitFlag　等待消息显示与否标志
     */
    void waitMessageShowOrHideSlot(int waitFlag);

    /**
     * @brief startDateChangedSlot          子页面:日志 开始日期更改槽函数
     * @param startDate                     要修改的开始日期
     */
    void startDateChangedSlot(QDate startDate);
    /**
     * @brief endDateChangedSlot            子页面:日志 结束日期更改槽函数
     * @param EndDate                       要修改的结束日期
     */
    void endDateChangedSlot(QDate EndDate);
    /**
     * @brief setHmiIpSlot                  子页面:IP设置 设置示教器IP响应槽函数
     * @param hmiIp                         示教器IP
     */
    void setHmiIpSlot(QVector<int> hmiIp,QVector<int> hmiGateway,QVector<int> hmiDNS);
    /**
     * @brief setControllerIpSlot           子页面:IP设置 设置控制器IP响应槽函数
     * @param controllerIp                  控制器IP
     */
    void setControllerIpSlot(QVector<int> ctrlIp, QVector<int> ctrlGateway, QVector<int> ctrlDNS);
    /**
     * @brief modifySlot            子页面:密码修改 密码修改的槽函数
     */
    void modifySlot();
    /**
     * @brief registrateSlot        子页面:密码 接收 来自com delegate的密码结果
     * @param regisNum
     */
    void recvChangePasswordResult(int result);
    void controllerShutDownEnableSlot(bool enable);

    /**
     * @brief setStartTypeSlot      子页面:启动模式
     * @param type
     */
    void setStartTypeSlot(int type);
    /**
     * @brief setShutDownSlot       子页面 启动模式 确认，用户关机指令
     */
    void setShutDownSlot();
    /**
     * @brief shutDownStartSlot     控制器反馈的关机
     */
    void shutDownStartSlot(int s);
    /**
     * @brief shutDownStartSlot     子页面 启动模式 关机状态显示
     */
    void shutDownStartTimeSlot();

    /**
     * @brief setEditLanguageChangeMenu 菜单 语言设置
     * @param id
     */
    void setEditLanguageChangeMenu(int id);

    /**
     * @brief hmiUpdatePathSlot     子页面 升级还原 hmi升级
     * @param path
     */
    void hmiUpdatePathSlot(QString path);
    /**
     * @brief ctrlUpdatePathSlot    子页面 升级还原 控制器升级
     * @param path
     */
    void ctrlUpdatePathSlot(QString path);
    /**
     * @brief hmiRestoreSlot        子页面 升级还原 hmi还原
     */
    void hmiRestoreSlot();
    /**
     * @brief ctrlRestoreSlot       子页面 升级还原 控制器还原
     */
    void ctrlRestoreSlot();

    //按钮的槽函数
public slots:

    void setMotorDcModeSlot(int value);
    void clearMotorBatteryErrorSlot();
    void showEthercatSlavesInformationSlot(std::vector<EcatBusDevInfo_gsoap> slavesInfo );
    void writeEthercatDeviceAliasSlot(int nodeId,int alias);
    void getEthercatSlavesInformationSlot();

    void showDebugInfo_motionServerSlot(MotionDebugInfo info);
    void showDebugInfo_programEngineSlot(ProgramEngineDebugInfo info);
    void showDebugInfo_programEngineSlot(std::vector<ProgramEngineDebugInfo> info);
    void showTaskInfoSlot(TaskManagerInfo info);

    void getPogramEngineDebugInfoSlot();
    void getMotionEngineDebugInfoSlot();
    void getTaskInfoSlot();

    void showDebugDlgSlot();
    void showBackupSlot();
    void showRecoverySlot();
    void showStorageStatusSlot();
    void showRestoreAndBackupDlgSlot();
    void showFileManage_Slot();

    void showUserChangeSlot();
    void showPasswordChangeSlot();

    void showCoordinateSlot();
    void showManualServonSlot();
    void showTouchCorrectSlot();
    void showIPSetSlot();
    void showAdditionLoadSlot();
    void showSecurePointSlot();
    void showInterferenceAreaSlot();
    void showEtherSlot();
    void showRSR1Slot();
    void showSoftLimitSlot();
    void showOtherSettingDlgSlot();

    void showDevLogSlot();

    void showAreaOffsetSlot();

    void showColdStartSlot();
    void showHotStartSlot();

    void showCompanyInformationSlot();
    void showSoftwareInformationSlot();
    void showRegisterSlot();
    void showRestoreSlot();
    void showRestoreFromPcSlot();

    void showCalibrateDlgSlot();
    void showRobotTopologySlot();
    void showECATTopologySlot();
    void showDIDOMappingSlot();
    void showRobotConfigSlot();
    void showVrepConfigSlot();
    void showProEditLanguage0Slot();
    void showProEditLanguage1Slot();

    void changeLanguageSlot(int language);


//    /**
//     * @brief getLogFileDirSlot                 获取登录文件目录响应槽函数
//     * @param logFileFtpDirectory               文件信息容器
//     * @param logFileClientPath                 登录文件下载到客户端的地址
//     */
//    void getLogFileDirSlot(QHash<QString,bool> , const QString &logFileFtpDirectory, const QString &logFileClientPath);

//    /**
//     * @brief getFileSlot                       获取文件下载状态信息
//     * @param status                            下载状态
//     * @param message                           消息
//     */
//    void getFileSlot(bool status, QString message);

private:
        void initConnect();

public:
    SystemCmdDelegate *systemCmdDelegate;
    QTimer *timer;
    //数据监视器 用
    bool motorStatusFlag;
    //坐标系 用
    bool initCoordInfoData;
    //压缩解压命令 用
    int robotSize;
    QThread cmdThread;
    //关机 用
    QTimer *shutDownTimer;
    int shutDownFlag;
    int shutDownS;

private:
    HomeMenuView *homeMenuView;         //可以通过此处控制所有子页面的状态
    GlobalData *globalData;
    MoveOperation *moveOperation;
    CommunicateNormalDelegate *communicateNormalDelegate;

    QTranslator translator;
    //    PasswordCheckDialog* passCheckDlg;
    //    bool isPasswordCorrectFlag;
        int currentFileIndex;

        QVector <QString> logFileNameList;

        QString clientPathTmp;

        QString serverPathTmp;

        std::vector<struct PointPro> pointList_zeroCalculate;
        AxisZeroOffsetInfo zeroReturnInfo;

};

#endif // HOMEMENUDELEGATE_H
